package com.eight.aspect;


import com.eight.mapper.LoginInfoMapper;
import com.eight.pojo.SysLogininfor;
import com.eight.util.JWTTool;
import com.eight.util.TimeUtil;
import com.eight.util.WebUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * @Description: 创建日志的aop类
 * @Author: Van.Planifolia
 * @CreateTime: 2022-12-23  15:36
 * @Version: 1.0
 */
@Component
@Aspect

public class LoginAspect {
    // 注入Log的Mapper
    @Resource
    LoginInfoMapper loginInfoMapper;
    // 创建切入点，增强@Login标注的方法
    @Pointcut("@annotation(com.eight.annotation.Login)")
    public void pointCut() {
    }

    /**
     * 写入登录日志的aop方法
     * @param joinPoint 连接点信息也就是被增强的方法
     */
    @After("pointCut()")
    public void makeLog(JoinPoint joinPoint) {
        // 通过request中的token获取到当前用户的信息
        HttpServletRequest request = WebUtil.getRequest();
        // 解析token从而拿到用户的具体信息
        Object[] args = joinPoint.getArgs();
        // 获取状态与token
        Integer statu = (Integer) args[0];
        String token = (String) args[1];
        // 获取时间
        LocalDateTime now = TimeUtil.now(null);
        // 创建日志对象
        SysLogininfor loginInfo = new SysLogininfor();
        // 获取用户的浏览器以及一切信息
        String remoteAddr = request.getRemoteAddr();
        String userAgent = request.getHeader("user-agent");
        // 看token是否存在
        if (StringUtils.hasText(token)){
            Map<String, Object> userMap = JWTTool.analyzeToken(token);
            String username = userMap.get("username").toString();
            loginInfo.setLoginName(username).setLoginTime(now).setMsg("").setBrowser(userAgent).setIpaddr(remoteAddr).setStatu(statu);
        }else {
            loginInfo.setLoginName("unknown").setLoginTime(now).setMsg("").setBrowser(userAgent).setIpaddr(remoteAddr).setStatu(statu);
        }
        // 然后执行dao操作
        loginInfoMapper.insert(loginInfo);
    }

}
